package cn.kgc.listener.canal;

import cn.hutool.core.collection.CollUtil;
import cn.kgc.base.BaseInfoProperties;
import cn.kgc.entity.Industry;
import cn.kgc.service.IndustryService;
import com.alibaba.otter.canal.protocol.CanalEntry;
import com.xpand.starter.canal.annotation.CanalEventListener;
import com.xpand.starter.canal.annotation.ListenPoint;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * @author wangyue
 * @version 1.0
 * 监听hire数据库中Industry表中的数据变化,如果
 * Industry表中执行了数据新增 修改 删除的操作,修改缓存中行业的信息。
 */
@Slf4j
@Component
@CanalEventListener
@SuppressWarnings("all")
public class CanalIndustryListener  extends BaseInfoProperties {
    @ListenPoint(
            schema = "hire",
            table = "industry",
            eventType = {CanalEntry.EventType.DELETE}
    )
    public void  listenerDelete(CanalEntry.RowData rowData){
        List<CanalEntry.Column> beforeColumnsList = rowData.getBeforeColumnsList();
        resetIndustryCache(beforeColumnsList); //获得删除的数据重置缓存
    }

    @ListenPoint(
            schema = "hire",
            table = "industry",
            eventType = {
                    CanalEntry.EventType.INSERT,
                    CanalEntry.EventType.UPDATE
            }
    )
    public void  listenerInsertOrUpdate(CanalEntry.RowData rowData){
        List<CanalEntry.Column> afterColumnsList = rowData.getAfterColumnsList();
        resetIndustryCache(afterColumnsList); //获得新增或修改的数据重置缓存
    }

    @Resource
    private IndustryService industryService;

    private void resetIndustryCache(List<CanalEntry.Column> columnsList){
        //遍历新增 修改  删除 一行数据的所有字段
        String level="";
        String fatherId="";
        for (CanalEntry.Column column : columnsList) {
            //获得level字段的值(根据level字段的值可以判断是几级行业)
            if(column.getName().equals("level")){
                level = column.getValue();
            }
            //获得行业分类的父级行业的ID
            if(column.getName().equals("father_id")){
                fatherId = column.getValue();
            }
        }
        if(level.equals("1")){
            //1 如果新增修改删除一级行业信息,则重置一级行业缓存。
            List<Industry> topIndustry = industryService.getTopIndustry();
            redisUtil.set(INDUSTRY_ALL_PREFIX,topIndustry);
        }else if(level.equals("3")){
            //2 如果新增修改删除三级行业信息  重置三级行业对应的一级行业下三级行业的缓存信息。
            //如果当前行业是三级行业分类,获得三级行业分类对应二级行业分类的id(fatherId)
            //根据二级行业分类的id查询二级行业分类的信息,获得二级行业分类的父级行业分类的ID(一级行业分类)
            String topId = industryService.getById(fatherId).getFatherId();
            //获得一级行业分类下的三级行业分类的缓存信息
            List<Industry> thirdIndustry = industryService.getThirdIndustry(topId);
            if(CollUtil.isEmpty(thirdIndustry)){
                //如果当前一级行业分类下没有三级行业分类,保存一个空的集合,指定过期时间。
                redisUtil.set(INDUSTRY_TOP_PREFIX+topId,thirdIndustry,5, TimeUnit.SECONDS);
            }else{
                //重置一级行业分类下的三级行业分类的缓存信息
                redisUtil.set(INDUSTRY_TOP_PREFIX+topId,thirdIndustry);
            }
        }
    }
}